Skip to contentMethod: static {...}
1: /**
2: * Copyright (C) 2022 Czech Technical University in Prague
3: * <p>
4: * This program is free software: you can redistribute it and/or modify it under
5: * the terms of the GNU General Public License as published by the Free Software
6: * Foundation, either version 3 of the License, or (at your option) any
7: * later version.
8: * <p>
9: * This program is distributed in the hope that it will be useful, but WITHOUT
10: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
12: * details. You should have received a copy of the GNU General Public License
13: * along with this program. If not, see <http://www.gnu.org/licenses/>.
14: */
15: package cz.cvut.kbss.jsonld.deserialization.expanded;
16:
17: import cz.cvut.kbss.jsonld.Configuration;
18: import cz.cvut.kbss.jsonld.deserialization.DefaultInstanceBuilder;
19: import cz.cvut.kbss.jsonld.deserialization.DeserializationContext;
20: import cz.cvut.kbss.jsonld.deserialization.InstanceBuilder;
21: import cz.cvut.kbss.jsonld.deserialization.JsonLdDeserializer;
22: import cz.cvut.kbss.jsonld.deserialization.reference.PendingReferenceRegistry;
23: import cz.cvut.kbss.jsonld.exception.JsonLdDeserializationException;
24:
25: import java.util.List;
26: import java.util.Map;
27:
28: public class ExpandedJsonLdDeserializer extends JsonLdDeserializer {
29:
30: public ExpandedJsonLdDeserializer() {
31: }
32:
33: public ExpandedJsonLdDeserializer(Configuration configuration) {
34: super(configuration);
35: }
36:
37: @Override
38: public <T> T deserialize(Object jsonLd, Class<T> resultClass) {
39: if (!(jsonLd instanceof List)) {
40: throw new JsonLdDeserializationException(
41: "Expanded JSON-LD deserializer requires a JSON-LD array as input.");
42: }
43: final List<?> input = (List<?>) jsonLd;
44: if (input.size() != 1) {
45: throw new JsonLdDeserializationException(
46: "Input is not expanded JSON-LD. The input does not contain exactly one root element.");
47: }
48: deserializers.configure(configuration());
49: final Map<?, ?> root = (Map<?, ?>) input.get(0);
50: final PendingReferenceRegistry referenceRegistry = new PendingReferenceRegistry();
51: if (deserializers.hasCustomDeserializer(resultClass)) {
52: final DeserializationContext<T> ctx = new DeserializationContext<>(resultClass, classResolver);
53: assert deserializers.getDeserializer(ctx).isPresent();
54: return deserializers.getDeserializer(ctx).get().deserialize(root, ctx);
55: }
56: final InstanceBuilder instanceBuilder = new DefaultInstanceBuilder(classResolver, referenceRegistry);
57: new ObjectDeserializer(instanceBuilder, new DeserializerConfig(configuration(), classResolver, deserializers), resultClass)
58: .processValue(root);
59: referenceRegistry.verifyNoUnresolvedReferencesExist();
60: assert resultClass.isAssignableFrom(instanceBuilder.getCurrentRoot().getClass());
61: return resultClass.cast(instanceBuilder.getCurrentRoot());
62: }
63: }